home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMICUS24.ADF
/
BNTools
/
Why.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-04-16
|
7KB
|
234 lines
; Tabs set every 8.
;
;BETTERCLI(tm) "WHY" Command, release 1
;
;BETTERCLI WHY (C)1987 Bryce Nesbitt. Unlimited free non-exclusive licence
;hereby granted to any sentient being to use or abuse this code in any way
;whatsoever provided that this and any other copyright notices remain fully
;attached and are reproduced in any simultaneously distributed printed matter
;and with the exception that, without prior written permission, it not
;be utilized by any entity that has been commonly referred to as Robert
;W. Skyles, Skyles Electric Works, Jim Drew, Regie Warren or any organization
;founded by, controlled, employing or profiting any such entity, it's
;offspring or spouses. ARP and FISH use welcome.
;Author correspondence, bug or stupidity reports may be directed to:
; Bryce Nesbitt
; 1712 Marin Ave.
; Berkeley, Ca 94707-2206
;
;This program replaces the CLI WHY command, providing faster execution and
;enhanced functionality. The old WHY command was simply a stub that called
;'C:FAULT', and thus could not be made properly RESIDENT. This command was
;to replace FAULT as well, however the BCPL code does something funky
;when calling FAULT, and I could not discover it's secret.
;
; Return code convention:
; 20 FAIL -serious error, DOS will not open, out of memory.
; 10 ERROR -user caused error (syntax, file not found etc.)
; -less serious than FAIL.
; 5 WARN -technicality (file not found on DELETE, for example)
; 0 OK -command sucessful, operation completed.
;
;This code is REUSABLE,REENTRANT and fully RESIDENT COMPATIBLE.
;Stack 1600 ok.
*************************
jsrlib macro
xref _LVO\1
jsr _LVO\1(a6)
endm
jmplib macro
xref _LVO\1
jmp _LVO\1(a6)
endm
;INCLUDE 'lib/exec_lib.i' ;You don't have these files
;INCLUDE 'lib/dos_lib.i' ;so please ignore these lines.
INCLUDE 'libraries/dosextens.i'
*************************
CODE
outhand equr d6
failcode equr d5
proc equr a5
cli equr a4
;d0-d4 a0-a3 scratch
;-- Setup --
StartUp: moveq #20,failcode ;default-SEVERE failure
move.l 4,a6 ;get exec library base pointer
lea dosname(pc),a1
jsrlib OldOpenLibrary ;get this... Compatability with V1.0!
move.l d0,outhand ;temp for DOSBase
beq.s e_dos ;fail if it will not open
suba.l a1,a1 ;find THIS task
jsrlib FindTask
move.l d0,proc
move.l pr_CLI(proc),cli
adda.l cli,cli ;ban the BPTR!!
adda.l cli,cli ;ban the BPTR!!
move.l outhand,a6 ;DOSBase
jsrlib Output
move.l d0,outhand
beq.s e_output
;--
lea mes1s(pc),a0 ;'Fail code '
moveq #mes1e-mes1s,d3
bsr.s DOWRITED
;-- Get fail code --
move.l cli_ReturnCode(cli),d0
bsr.s PRINTDECIMAL
;--
lea mes2s(pc),a0 ;'and error code '
moveq #mes2e-mes2s,d3
bsr.s DOWRITED
;-- Print error number --
move.l cli_Result2(cli),d0
bsr.s PRINTDECIMAL
;--
lea mes3s(pc),a0 ;';'
moveq #mes3e-mes3s,d3
bsr.s DOWRITED
;-- Print error text --
move.l cli_Result2(cli),d0
bsr.s PCODE
moveq #0,failcode
e_error
e_output move.l a6,a1
move.l 4,a6
jsrlib CloseLibrary
e_dos move.l failcode,d0
rts1 rts
;
;DOWRITED(pointer,length)
; a0 d3
;Aborts if error
;
DOWRITED ;[d3=length]
move.l a0,d2
move.l outhand,d1
jsrlib Write
cmp.l d0,d3
beq.s rts1
e_badwrite addq.l #4,a7 ;pop return off stack
jsrlib IoErr
move.l d0,pr_Result2(proc)
bra.s e_error ;(return code is set to FAIL, 20)
;
;
;
PCODE moveq #10,d1
lea table(pc),a1
checknext move.l a1,a0 ;Save pointer to this line
moveq #-1,d3
findend cmp.b (a1)+,d1 ;count length
dbeq d3,findend ;68010 loop mode!
neg.l d3 ;compensate for backwards count
subq.l #1,d3 ;tweak
cmp.b #$ff,(a0)
beq.s gotit ;end of list, use default
cmp.b (a0),d0
bne.s checknext
gotit addq.l #1,a0 ;skip error #
bra.s DOWRITED ;[a0-string|d3-len]
;
;Bloated, slow, kludg-o 32 bit signed print decimal routine.
;destroys D2,D3
;
countvar equr d1
tableoffset equr d2
PRINTDECIMAL moveq #-4,tableoffset
subq.l #6,a7
subq.l #6,a7 ;reserve 12 bytes for number
move.l a7,a0
tst.l d0
beq.s zero
bpl.s positive
move.b #'-',(a0)+
neg.l d0
positive addq.l #4,tableoffset
cmp.l table2(pc,tableoffset.l),d0
bcs.s positive ;BLO
doloop move.l table2(pc,tableoffset.w),countvar
beq.s endofnum
moveq #-1,countvar
subloop addq.l #1,countvar
sub.l table2(pc,tableoffset.w),d0
bcc.s subloop
add.l table2(pc,tableoffset.w),d0 ;Ooops! Too far!!
ori.b #$30,countvar
move.b countvar,(a0)+
addq.l #4,tableoffset
bra.s doloop
zero move.b #$30,(a0)+
endofnum suba.l a7,a0
move.l a0,d3
move.l a7,d2
move.l outhand,d1
jsrlib Write
addq.l #6,a7
addq.l #6,a7
cmp.l d0,d3
bne.s e_badwrite
rts
table2 dc.l 1000000000
dc.l 100000000
dc.l 10000000
dc.l 1000000
dc.l 100000
dc.l 10000
dc.l 1000
dc.l 100
dc.l 10
dc.l 1
dc.l 0
dosname dc.b 'dos.library',0
mes1s dc.b 'Fail code '
mes1e
mes2s dc.b ', and error code '
mes2e
mes3s dc.b '; '
mes3e
dc.b '(C)1987 Bryce Nesbitt'
;
;Error message table. Feel free to translate into other languages such as
;German, Italian, or even English. Error numbers 200 and 201
;are unauthorized 'enhancments' to the standard.
;
table dc.b 103,'insufficient free store',10
dc.b 105,'task table full',10 ;!!Eliminate need!!
dc.b 120,'argument line invalid or too long',10
dc.b 121,'file is not an object module',10
dc.b 122,'invalid resident library during load',10
dc.b 200,'internal error',10
dc.b 201,'newer operating system required',10
dc.b 202,'object in use',10
dc.b 203,'object already exists',10
dc.b 204,'directory not found',10
dc.b 205,'object not found',10
dc.b 206,'invalid window description',10
;dc.b 207,'object too large',10 ;obsolete
dc.b 209,'packet request type unknown',10
dc.b 210,'stream name component invalid',10 ;what??
dc.b 211,'invalid object lock',10
dc.b 212,'object not of required type',10
dc.b 213,'disk not validated',10
dc.b 214,'disk write-protected',10
dc.b 215,'rename across devices attempted',10
dc.b 216,'directory not empty',10
;dc.b 217,'too many levels;,10 ;obsolete
dc.b 218,'device (or volume) not mounted',10
dc.b 219,'seek failure',10
dc.b 220,'comment too big',10
dc.b 221,'disk full',10
dc.b 222,'file is protected from deletion',10
dc.b 223,'file is write protected',10
dc.b 224,'file is read protected',10
dc.b 225,'not a valid DOS disk',10
dc.b 226,'no disk in drive',10
;dc.b 227,'can',$27,'t open window',10
;dc.b 228,'can',$27,'t open screen',10
dc.b 232,'no more entries in directory',10
dc.b 255,'no error message',10
;-- end --